/*创建了一个信号量，并通过P操作和V操作实现了父子进程之间的同步。具体流程如下：

程序使用ftok函数生成一个唯一的key。
通过semget函数创建一个包含一个信号量的信号量集合。
调用init_sem函数初始化信号量的初始值为1。
程序使用fork创建一个子进程。
子进程执行P操作，减少信号量的值。
子进程输出一些信息，然后睡眠一段时间。
子进程执行V操作，增加信号量的值。
子进程退出。
父进程执行P操作，减少信号量的值。
父进程输出一些信息，然后睡眠一段时间。
父进程执行V操作，增加信号量的值。
父进程等待子进程结束。
父进程删除信号量。
父进程退出。

通过信号量的P操作和V操作，子进程和父进程可以互相等待和同步执行特定的代码块。*/

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/sem.h>
#include "sem_com.c"   // 引入信号量相关函数的实现
#include <sys/types.h>
#include <sys/ipc.h>

#define DELAY_TIME 3

int main(){
    pid_t pid;
    int sem_id;
    key_t sem_key;
    
    sem_key = ftok(".", 'b');   // 使用字符'b'生成一个唯一的key
    if ((sem_id = semget(sem_key, 1, 0666|IPC_CREAT)) == -1){   // 创建一个信号量集合，其中包含一个信号量
        perror("sem get");
        exit(-1);
    }

    init_sem(sem_id, 1);   // 初始化信号量的初始值为1

    if ((pid = fork()) < 0){
        perror("fork");
        exit(1);
    }else if (pid == 0){   // 子进程
        sem_p(sem_id);   // 执行P操作
        printf("1.In child process:\n");
        sleep(DELAY_TIME);
        printf("2.Child pid:%d\n", getpid());
        sem_v(sem_id);   // 执行V操作
        exit(0);
    }else{   // 父进程
        sem_p(sem_id);   // 执行P操作
        printf("3.In parent process:\n");
        sleep(DELAY_TIME);
        printf("4.Parent pid:%d\n", getpid());
        sem_v(sem_id);   // 执行V操作
        
        waitpid(pid, 0, 0);   // 等待子进程结束
        del_sem(sem_id);   // 删除信号量
        exit(0);
    }

    return 0;
}
